package com.demo.jzoffer2;

import com.demo.domain.TreeNode;
import org.junit.Test;

/**
 * @author gy
 * @date 2022/11/15
 */
public class Test1207_01 {

    /**
     * 请实现一个函数，用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样，那么它是对称的。
     *
     * 例如，二叉树 [1,2,2,3,4,4,3] 是对称的。
     *
     * 我们可以实现这样一个递归函数，通过「同步移动」两个指针的方法来遍历这棵树，p 指针和 q 指针一开始都指向这棵树的根，
     * 随后 p 右移时，q 左移，p 左移时，q 右移。每次检查当前 p 和 q 节点的值是否相等，如果相等再判断左右子树是否对称。
     *
     * @param root
     * @return
     */
    public boolean isSymmetric(TreeNode root) {
        //思路分析：通过实现一个递归函数，使用p、q双指针来遍历这颗数，p和q同时指向树的根节点
        // p向右移动时，q向左移动；p向左移动时，q向右移动
        // 判断是否为镜像树的关键条件：p和q的值是否相等；若相等，判断p的左子树和q的右子树是否相等，以及 p的右子树和q的左子树是否相等
        return check(root, root);
    }

    public boolean check(TreeNode p,TreeNode q){
        // 1、 特殊情况 p q 指针都为null
        if (p == null && q == null){
            return true;
        }
        // 满足条件1的情况下，p或q肯定有一个不为null
        if (p == null || q == null){
            return false;
        }
        // 判断是否为镜像树的关键条件：p和q的值是否相等；若相等，判断p的左子树和q的右子树是否相等，以及 p的右子树和q的左子树是否相等
        return p.val == q.val && check(p.left,q.right) && check(p.right,q.left);
    }

    @Test
    public void m1() {

    }

}
